"""
文件配置管理

负责管理文件路径和文件类型相关的配置。
"""

import os
from typing import Dict, Any

from .base_config import BaseConfig


class FileConfig(BaseConfig):
    """文件配置管理类"""

    @property
    def data_dir(self) -> str:
        """数据目录路径"""
        return self._get_env("DATA_DIR", "I:\\SimpleRag\\data")

    @property
    def index_dir(self) -> str:
        """索引存储目录路径"""
        return self._get_env("INDEX_DIR", "I:\\SimpleRag\\storage")

    @property
    def pdf_reader_mode(self) -> str:
        """PDF读取模式"""
        return self._get_env("PDF_READER_MODE", "single")

    @property
    def pdf_inline_images(self) -> bool:
        """PDF内联图片"""
        return self._get_env_bool("PDF_INLINE_IMAGES", True)

    @property
    def pdf_preserve_whitespace(self) -> bool:
        """PDF保留空白字符"""
        return self._get_env_bool("PDF_PRESERVE_WHITESPACE", True)

    @property
    def word_preserve_formatting(self) -> bool:
        """Word文档保留格式"""
        return self._get_env_bool("WORD_PRESERVE_FORMATTING", True)

    @property
    def word_extract_tables(self) -> bool:
        """Word文档提取表格"""
        return self._get_env_bool("WORD_EXTRACT_TABLES", True)

    @property
    def md_preserve_links(self) -> bool:
        """Markdown保留链接"""
        return self._get_env_bool("MD_PRESERVE_LINKS", True)

    @property
    def md_code_block_chunking(self) -> bool:
        """Markdown代码块分块"""
        return self._get_env_bool("MD_CODE_BLOCK_CHUNKING", True)

    @property
    def max_concurrent_embedding(self) -> int:
        """最大并发嵌入数"""
        return self._get_env_int("MAX_CONCURRENT_EMBEDDING", 8)

    @property
    def enable_embedding_cache(self) -> bool:
        """启用嵌入缓存"""
        return self._get_env_bool("ENABLE_EMBEDDING_CACHE", True)

    @property
    def embedding_cache_ttl(self) -> int:
        """嵌入缓存TTL（秒）"""
        return self._get_env_int("EMBEDDING_CACHE_TTL", 3600)

    @property
    def max_memory_usage(self) -> int:
        """最大内存使用量（MB）"""
        return self._get_env_int("MAX_MEMORY_USAGE", 2048)

    def validate_paths(self) -> None:
        """验证文件路径"""
        # 确保数据目录存在
        if not os.path.exists(self.data_dir):
            os.makedirs(self.data_dir, exist_ok=True)

        # 确保索引目录存在
        if not os.path.exists(self.index_dir):
            os.makedirs(self.index_dir, exist_ok=True)

    def get_file_type_config(self) -> Dict[str, Any]:
        """获取文件类型配置"""
        return {
            "pdf": {
                "reader_mode": self.pdf_reader_mode,
                "inline_images": self.pdf_inline_images,
                "preserve_whitespace": self.pdf_preserve_whitespace
            },
            "word": {
                "preserve_formatting": self.word_preserve_formatting,
                "extract_tables": self.word_extract_tables
            },
            "markdown": {
                "preserve_links": self.md_preserve_links,
                "code_block_chunking": self.md_code_block_chunking
            }
        }

    def get_performance_config(self) -> Dict[str, Any]:
        """获取性能配置"""
        return {
            "max_concurrent_embedding": self.max_concurrent_embedding,
            "enable_embedding_cache": self.enable_embedding_cache,
            "embedding_cache_ttl": self.embedding_cache_ttl,
            "max_memory_usage": self.max_memory_usage
        }